package br.edu.universo.si.projeto2.infojob.server.persistencia;

import java.io.File;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import br.edu.universo.si.projeto2.infojob.client.bean.BeanCurriculoConhecimentos;
import br.edu.universo.si.projeto2.infojob.client.bean.BeanNacionalidade;
import br.edu.universo.si.projeto2.infojob.client.bean.BeanProfissionalAssinante;
import br.edu.universo.si.projeto2.infojob.client.bean.BeanProfissionalCurriculo;
import br.edu.universo.si.projeto2.infojob.client.bean.BeanTitularidade;
import br.edu.universo.si.projeto2.infojob.server.Database;

/**
 * Classe de persistência de Currículos.
 * @author Andrey A. de Oliveira e Anizair Lopes
 */
public class PCurriculo
{
	/**
	 * Busca todos os currículos pelo ID do profissional.
	 * @author Marcelo M. Fleury
	 * @param idProfissional
	 * @return ArrayList<BeanProfissionalCurriculo>
	 * @throws ClassNotFoundException
	 * @throws SQLException
	 */
	public static ArrayList<BeanProfissionalCurriculo> getCurriculos(Integer idProfissional)
		throws ClassNotFoundException, SQLException
	{
		ArrayList<BeanProfissionalCurriculo> clCurriculos = new ArrayList<BeanProfissionalCurriculo>();

		Database database = Database.getInstance();

		PreparedStatement pStmt = 
			database.getPreparedStatement(
						"SELECT *, to_char(ultima_atualizacao, 'dd/mm/YYYY') AS data_atualizacao_str, to_char(data_criacao, 'dd/mm/YYYY') " +
						"AS data_criacao_str FROM infojob.tb_profissional_curriculo AS profissional_curriculo " +
						"WHERE profissional_curriculo.id_profissional = ?");

		pStmt.setInt(1, idProfissional);

		ResultSet rs = pStmt.executeQuery();

		while (rs.next())
		{
			BeanProfissionalCurriculo bCurriculo = new BeanProfissionalCurriculo();

			bCurriculo.setId(rs.getInt("id"));

			BeanNacionalidade bNacionalidade = PNacionalidade.getNacionalidadeById(rs.getInt("id_nacionalidade"));
			bCurriculo.setBNacionalidade(bNacionalidade);

			bCurriculo.setDescricaoPessoal(rs.getString("descricao_pessoal"));

			BeanTitularidade bTitularidade = PTitularidade.getTitularidadeById(rs.getInt("id_titularidade"));
			bCurriculo.setBTitularidade(bTitularidade);

			bCurriculo.setDisponibilidadeViagem(rs.getBoolean("disponibilidade_viagens"));

			BeanProfissionalAssinante bProfissional = PProfissional.getProfissionalById(rs.getInt("id_profissional"));
			bCurriculo.setBProfissional(bProfissional);

			bCurriculo.setUltimaAtualizacao(rs.getString("data_atualizacao_str"));
			bCurriculo.setDataCriacao(rs.getString("data_criacao_str"));
			bCurriculo.setComentario(rs.getString("comentario"));

			clCurriculos.add(bCurriculo);
		}

		return clCurriculos;
	}

	/**
	 * Busca todo o cv pelo id
	 * @author Marcelo M. Fleury
	 * @param idCurriculo
	 * @return BeanProfissionalCurriculo
	 * @throws ClassNotFoundException
	 * @throws SQLException
	 */
	public static BeanProfissionalCurriculo getCurriculoById(int idCurriculo)
		throws ClassNotFoundException, SQLException
	{

		Database database = Database.getInstance();

		PreparedStatement pStmt = 
			database.getPreparedStatement(
						"SELECT *, to_char(ultima_atualizacao, 'dd/mm/YYYY') AS data_atualizacao_str, to_char(data_criacao, 'dd/mm/YYYY') " +
						"AS data_criacao_str FROM infojob.tb_profissional_curriculo AS profissional_curriculo " +
						"WHERE profissional_curriculo.id = ?");

		pStmt.setInt(1, idCurriculo);

		ResultSet rs = pStmt.executeQuery();

		BeanProfissionalCurriculo bCurriculo = new BeanProfissionalCurriculo();
		
		while (rs.next())
		{

			bCurriculo.setId(rs.getInt("id"));

			BeanNacionalidade bNacionalidade = PNacionalidade.getNacionalidadeById(rs.getInt("id_nacionalidade"));
			bCurriculo.setBNacionalidade(bNacionalidade);

			bCurriculo.setDescricaoPessoal(rs.getString("descricao_pessoal"));

			BeanTitularidade bTitularidade = PTitularidade.getTitularidadeById(rs.getInt("id_titularidade"));
			bCurriculo.setBTitularidade(bTitularidade);

			bCurriculo.setDisponibilidadeViagem(rs.getBoolean("disponibilidade_viagens"));

			BeanProfissionalAssinante bProfissional = PProfissional.getProfissionalById(rs.getInt("id_profissional"));
			bCurriculo.setBProfissional(bProfissional);

			bCurriculo.setUltimaAtualizacao(rs.getString("data_atualizacao_str"));
			bCurriculo.setDataCriacao(rs.getString("data_criacao_str"));
			bCurriculo.setComentario(rs.getString("comentario"));
		}
		return bCurriculo;
	}
	
	/**
	 * Busca todos os currículos pelo ID do profissional, com controle transacional.
	 * @author Marcelo M. Fleury
	 * @param idProfissional
	 * @return ArrayList<BeanProfissionalCurriculo>
	 * @throws ClassNotFoundException
	 * @throws SQLException
	 */
	public static ArrayList<BeanProfissionalCurriculo> getCurriculos(Connection conn, Integer idProfissional)
		throws ClassNotFoundException, SQLException
	{
		ArrayList<BeanProfissionalCurriculo> clCurriculos = new ArrayList<BeanProfissionalCurriculo>();
	
		Database database = Database.getInstance();
	
		PreparedStatement pStmt = 
			database.getPreparedStatement(conn,
						"SELECT *, to_char(ultima_atualizacao, 'dd/mm/YYYY') AS data_atualizacao_str, to_char(data_criacao, 'dd/mm/YYYY') " +
						"AS data_criacao_str FROM infojob.tb_profissional_curriculo AS profissional_curriculo " +
						"WHERE profissional_curriculo.id_profissional = ?");
	
		pStmt.setInt(1, idProfissional);
	
		ResultSet rs = pStmt.executeQuery();
	
		while (rs.next())
		{
			BeanProfissionalCurriculo bCurriculo = new BeanProfissionalCurriculo();
	
			bCurriculo.setId(rs.getInt("id"));
	
			BeanNacionalidade bNacionalidade = PNacionalidade.getNacionalidadeById(rs.getInt("id_nacionalidade"));
			bCurriculo.setBNacionalidade(bNacionalidade);
	
			bCurriculo.setDescricaoPessoal(rs.getString("descricao_pessoal"));
	
			BeanTitularidade bTitularidade = PTitularidade.getTitularidadeById(rs.getInt("id_titularidade"));
			bCurriculo.setBTitularidade(bTitularidade);
	
			bCurriculo.setDisponibilidadeViagem(rs.getBoolean("disponibilidade_viagens"));
	
			BeanProfissionalAssinante bProfissional = PProfissional.getProfissionalById(rs.getInt("id_profissional"));
			bCurriculo.setBProfissional(bProfissional);
	
			bCurriculo.setUltimaAtualizacao(rs.getString("data_atualizacao_str"));
			bCurriculo.setDataCriacao(rs.getString("data_criacao_str"));
			bCurriculo.setComentario(rs.getString("comentario"));
	
			clCurriculos.add(bCurriculo);
		}

		return clCurriculos;
	}

	/**
	 * Exclui currículo, com controle transacional.
	 * @author Andrey A. de Oliveira
	 * @param conn
	 * @param curriculo
	 * @throws ClassNotFoundException
	 * @throws SQLException
	 */
	public static void excluirCurriculo(Connection conn, BeanProfissionalCurriculo curriculo)
		throws ClassNotFoundException, SQLException
	{
		Database database = Database.getInstance();

		PreparedStatement pstmt = database.getPreparedStatement(conn, "DELETE FROM infojob.tb_profissional_curriculo WHERE id = ?; ");
		pstmt.setInt(1, curriculo.getId());

		pstmt.executeUpdate();
	}

	/**
	 * Excluir currículo pelo ID.
	 * @author Andrey A. de Oliveira
	 * @param id
	 * @return
	 * @throws ClassNotFoundException
	 * @throws SQLException
	 * @throws Exception
	 */
	public static Boolean excluirCurriculo(Integer id) throws ClassNotFoundException, SQLException, Exception
	{
		boolean bol;
		Connection conn = null;
		PreparedStatement pstm = null;
		try {
			Database database = Database.getInstance();
			conn = database.getConnection();
			conn.setAutoCommit(false);

			String qryConhecimento = "Delete from infojob.tb_curriculo_conhecimentos where id_curriculo = ?";
			pstm = conn.prepareStatement(qryConhecimento);
			pstm.setInt(1, id);
			pstm.executeUpdate();

			String qryCurso = "Delete from infojob.tb_curriculo_Cursos where id_curriculo = ?";

			pstm = conn.prepareStatement(qryCurso);
			pstm.setInt(1, id);
			pstm.executeUpdate();

			String qry = "Delete from infojob.tb_profissional_curriculo where id = ?";
			pstm = conn.prepareStatement(qry);
			pstm.setInt(1, id);
			pstm.executeUpdate();

			conn.commit();
			bol = true;
		} catch (Exception e) {
			e.printStackTrace();
			bol = false;
			conn.rollback();
			throw new Exception(e.getMessage());
		} finally {
			conn.setAutoCommit(true);
		}

		return bol;
	}

	/**
	 * ???
	 * @author Anizair Lopes
	 * @param bprofissionalcurribulo
	 * @param bcurconhecimento
	 * @return
	 * @throws Exception
	 */
	public static boolean salvarOuAtualizar(
			BeanProfissionalCurriculo bprofissionalcurribulo,
			List<BeanCurriculoConhecimentos> bcurconhecimento) throws Exception {

		boolean retorno = false;

		try {
			Database database = Database.getInstance();
			if (bprofissionalcurribulo.getId() == 0) {
				String qry = "INSERT INTO infojob.tb_profissional_curriculo(id_nacionalidade,"
						+ " descricao_pessoal, "
						+ " id_titularidade, disponibilidade_viagens, "
						+ " id_profissional, comentario, ultima_atualizacao, data_criacao)"
						+ " VALUES(?, ?, ?, ?, ?, ?, CURRENT_DATE, CURRENT_DATE)";

				PreparedStatement pstm = database.getPreparedStatement(qry);
				pstm.setInt(1, bprofissionalcurribulo.getBNacionalidade()
						.getId());
				pstm.setString(2, bprofissionalcurribulo.getDescricaoPessoal());
				pstm.setInt(3, bprofissionalcurribulo.getBTitularidade()
						.getId());
				pstm.setBoolean(4, bprofissionalcurribulo
						.isDisponibilidadeViagem());
				pstm.setInt(5, bprofissionalcurribulo.getBProfissional()
						.getId());
				// pstm.setString(6,
				// bprofissionalcurribulo.getUltimaAtualizacao());
				// pstm.setString(7, bprofissionalcurribulo.getDataCriacao());
				pstm.setString(6, bprofissionalcurribulo.getComentario());
				pstm.executeUpdate();
				String qryconsulta = "Select * from infojob.tb_profissional_curriculo";
				Statement stm = database.getStatement();
				ResultSet rs = stm.executeQuery(qryconsulta);
				while (!rs.isLast()) {
					rs.next();
				}
				int idcurriculo = rs.getInt("id");
				for (Iterator<BeanCurriculoConhecimentos> iterator = bcurconhecimento
						.iterator(); iterator.hasNext();) {
					BeanCurriculoConhecimentos beanCurriculoConhecimentos = (BeanCurriculoConhecimentos) iterator
							.next();
					beanCurriculoConhecimentos.setIdCurriculo(idcurriculo);
				}
				PCurriculoConhecimento
						.salvarCurriculoConhecimento(bcurconhecimento);

				retorno = true;

			} else {
				String qry = "UPDATE infojob.tb_profissional_curriculo SET id_nacionalidade = ?, "
						+ "descricao_pessoal = ?, id_titularidade = ?, disponibilidade_viagens = ?, "
						+ "id_profissional = ?, comentario = ?, ultima_atualizacao = CURRENT_DATE "
						+ " where id = ? ";

				PreparedStatement pstm = database.getPreparedStatement(qry);
				pstm.setInt(1, bprofissionalcurribulo.getBNacionalidade()
						.getId());
				pstm.setString(2, bprofissionalcurribulo.getDescricaoPessoal());
				pstm.setInt(3, bprofissionalcurribulo.getBTitularidade()
						.getId());
				pstm.setBoolean(4, bprofissionalcurribulo
						.isDisponibilidadeViagem());
				pstm.setInt(5, bprofissionalcurribulo.getBProfissional()
						.getId());
				// pstm.setString(6,
				// bprofissionalcurribulo.getUltimaAtualizacao());
				// pstm.setString(7, bprofissionalcurribulo.getDataCriacao());
				pstm.setString(6, bprofissionalcurribulo.getComentario());
				pstm.setInt(7, bprofissionalcurribulo.getId());
				pstm.executeUpdate();
				PCurriculoConhecimento
						.salvarCurriculoConhecimento(bcurconhecimento);
				retorno = true;

			}
		} catch (Exception e) {
			e.printStackTrace();
			throw new Exception(e.getMessage());
		}

		return retorno;

	}

	/**
	 * ???
	 * @author Anizair Lopes
	 * @param Id
	 * @param caminho
	 * @return
	 * @throws Exception
	 */
	public static String buscarRelatorioCurriculoEnviado(Integer Id, String caminho) throws Exception
	{
		String nomearquivo = "";

		try
		{
			Database database = Database.getInstance();
			PreparedStatement pmst = database.getPreparedStatement("SELECT *, " +
            		     " tb_vagas.cargo AS tb_vagas_cargo, " +
            		     " tb_vagas.remuneracao AS tb_vagas_remuneracao, " +
            		     " tb_vagas.data_criacao AS tb_vagas_data_criacao " +
            		     "FROM infojob.tb_profissional_assinante " +
            		     "INNER JOIN  infojob.tb_profissional_curriculo tb_profissional_curriculo ON tb_profissional_assinante.id = tb_profissional_curriculo.id_profissional " +
            		     "INNER JOIN  infojob.tb_vagas_candidatos tb_vagas_candidatos ON tb_profissional_curriculo.id = tb_vagas_candidatos.id_curriculo " +
            		     "INNER JOIN  infojob.tb_vagas tb_vagas ON tb_vagas_candidatos.id_vaga = tb_vagas.id  " +
            		     "INNER JOIN  infojob.tb_empresa_assinante tb_empresa_assinante ON tb_vagas.id_empresa = tb_empresa_assinante.id " +
            		     "WHERE  infojob.tb_profissional_assinante.id = ?");
            
            pmst.setInt(1, Id);
            
            ResultSet rs = pmst.executeQuery();
            if(!rs.next()){
            	return  "";
            }else {
			 
			    File fileJasper = new File(caminho);

				nomearquivo = fileJasper.getAbsolutePath();

				HashMap param = new HashMap();
				param.put("idprofissional", Id);

				JasperPrint impressao = JasperFillManager.fillReport(
						nomearquivo, param, database.getConnection());
				// JasperViewer.setDefaultLookAndFeelDecorated(true);
				// JasperViewer.viewReport(impressao, false);
				nomearquivo = nomearquivo
						.substring(0, nomearquivo.length() - 6)
						+ "pdf";
				JasperExportManager.exportReportToPdfFile(impressao,
						nomearquivo);
				
				return "sim";
			
            }
		}
		catch (JRException ex)
		{
			ex.printStackTrace();
			throw new Exception(ex.toString());
		}
		catch (Exception ex)
		{
			ex.printStackTrace();
			throw new Exception(ex.toString());
		}
	}

	/**
	 * Exclui um currículo que foi enviado à uma vaga. 
	 * @author Andrey A. de Oliveira
	 * @param conn
	 * @param curriculo
	 * @throws ClassNotFoundException
	 * @throws SQLException
	 */
	public static void excluirEnvioDeCurriculo(Connection conn, BeanProfissionalCurriculo curriculo)
		throws ClassNotFoundException, SQLException
	{
		Database database = Database.getInstance();

		PreparedStatement pstmt = 
			database.getPreparedStatement(conn, "DELETE FROM infojob.tb_vagas_candidatos WHERE id_curriculo = ?; ");
		pstmt.setInt(1, curriculo.getId());

		pstmt.executeUpdate();
	}
}